package com.esender.api.filter.impl;

import com.esender.api.client.BeaconCacheClient;
import com.esender.api.filter.CheckFilter;
import com.esender.common.constant.ApiConstant;
import com.esender.common.constant.CacheConstant;
import com.esender.common.enums.ExceptionEnums;
import com.esender.common.exception.ApiException;
import com.esender.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service(value = "fee")
@Slf4j
public class FeeCheckFilter implements CheckFilter {
    @Autowired
    private BeaconCacheClient cacheClient;
    /**
     * 只要短信内容的文字长度小于等于70个字，按照一条计算
     */
    private static final int MAX_LENGTH = 70;
    /**
     * 如果短信内容的文字长度超过70，67字/条计算
     */
    private static final int LOOP_LENGTH = 67;
    private static final String BALANCE = "balance";

    @Override
    public void check(StandardSubmit standardSubmit) {
        // 短信文字个数超过70字，按67字/条计算费用
        // 如果短信文字个数小于等于70字，按照一条计算即可、
        log.info("【接口模块-校验客户余额】   校验ing…………");
        // 1、先获取短信内容
        int length = standardSubmit.getText().length();
        // 2、判断短信内容的长度，如果<=70,算做一条，如果大于70字，那么67个字算作/条，算出来当前短信的费用
        if (length <= MAX_LENGTH){
            standardSubmit.setFee(ApiConstant.SINGLE_FEE);
        }else{
            // 获取条数,如果是67的倍数那么就是n条，如果不是就是n+1条
            int strip = length % LOOP_LENGTH == 0 ? length / LOOP_LENGTH : length / LOOP_LENGTH + 1;
            standardSubmit.setFee(ApiConstant.SINGLE_FEE * strip);
        }
        // 3、从redis中查询出客户的剩余金额(redis获取默认转成Integer)
        long balance = ((Integer) cacheClient.hget(CacheConstant.CLIENT_BALANCE + standardSubmit.getClientId(), BALANCE)).longValue();
        // 4、判断金额是否满足短信费用
        if (balance >= standardSubmit.getFee()){
            log.info("【接口模块-校验客户余额】   用户金额充足！！");
            return;
        }
        // 5、不满足抛出异常
        log.info("【接口模块-校验客户余额】   客户余额不足");
        throw new ApiException(ExceptionEnums.BALANCE_NOT_ENOUGH);
    }
}
